<!DOCTYPE HTML>
<html>

<head>
	<link rel="bookmark"  type="image/x-icon"  href="/img/logo.jpg"/>
	<link rel="shortcut icon" href="/img/logo.jpg">
	
			    <title>
    北望你的安
    </title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
    <link rel="stylesheet" href="/css/mic_main.css" />
    <link rel="stylesheet" href="/css/dropdownMenu.css" />
    <meta name="keywords" content="北望你的安" />
    
    	<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
	 
    <noscript>
        <link rel="stylesheet" href="/css/noscript.css" />
    </noscript>
    <style type="text/css">
        body:before {
          content: ' ';
          position: fixed;
          top: 0;
          background: url('/img/bg.jpg') center 0 no-repeat;
          right: 0;
          bottom: 0;
          left: 0;
          background-size: cover; 
        }
    </style>

			    
  


    <script src="/js/jquery.min.js"></script>
    <script src="/js/jquery.scrollex.min.js"></script>
    <script src="/js/jquery.scrolly.min.js"></script>
    <script src="/js/skel.min.js"></script>
    <script src="/js/util.js"></script>
    <script src="/js/main.js"></script>
	
</head>
    
		
<!-- Layouts -->



<!--  代码渲染  -->
<link rel="stylesheet" href="/css/prism_coy.css" />
<link rel="stylesheet" href="/css/typo.css" />
<!-- 文章页 -->
<body class="is-loading">
    <!-- Wrapper 外包 s-->
    <div id="wrapper" class="fade-in">
        <!-- Intro 头部显示 s -->
        <!-- Intro 头部显示 e -->
        <!-- Header 头部logo start -->
        <header id="header">
    <a href="/" class="logo">Krystalan</a>
</header>
        <!-- Nav 导航条 start -->
        <nav id="nav" class="special" >
            <ul class="menu links" >
			<!-- Homepage  主页  --> 
			<li >
	            <a href="/" rel="nofollow">主页</a>
	        </li>
			<!-- categories_name  分类   --> 
	        
	        <li class="active">
	            <a href="#s1">分类</a>
	                    <ul class="submenu">
	                        <li>
	                        <a class="category-link" href="/categories/%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0/">强化学习</a></li><li><a class="category-link" href="/categories/%E6%95%B0%E5%AD%A6/">数学</a></li><li><a class="category-link" href="/categories/%E7%AE%97%E6%B3%95/">算法</a></li><li><a class="category-link" href="/categories/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/">自然语言处理</a></li><li><a class="category-link" href="/categories/%E9%9A%8F%E7%AC%94/">随笔</a>
	                    </ul>
	        </li>
	        
	        <!-- archives  归档   --> 
	        
	        
		        <!-- Pages 自定义   -->
		        
		        <li>
		            <a href="/tags/" title="标签">
		                标签
		            </a>
		        </li>
		        
		        <li>
		            <a href="/gallery/" title="相册">
		                相册
		            </a>
		        </li>
		        


            </ul>
            <!-- icons 图标   -->
			<ul class="icons">
                    
                    <li>
                        <a title="github" href="https://github.com/krystalan" target="_blank" rel="noopener">
                            <i class="icon fa fa-github"></i>
                        </a>
                    </li>
                    
                    <li>
                        <a title="500px" href="https://www.zhihu.com/people/krystalzhu-an" target="_blank" rel="noopener">
                            <i class="icon fa fa-500px"></i>
                        </a>
                    </li>
                    
			</ul>
</nav>

        <div id="main" >
            <div class ="post_page_title_img" style="height: 25rem;background-image: url(/img/11.jpg);background-position: center; background-repeat:no-repeat; background-size:cover;-moz-background-size:cover;overflow:hidden;" >
                <a href="#" style="padding: 4rem 4rem 2rem 4rem ;"><h2 >移花接木花更盛</h2></a>
            </div>
            <!-- Post -->
            <div class="typo" style="padding: 3rem;">
                <blockquote>
<p>移花接木：指把一种花木的枝条或嫩芽嫁接在另一种花木上，比喻暗中用手段更换人或事物来欺骗别人。出自明·凌濛初《二刻拍案惊奇》。<br>花更盛：指花木迁移到另一种花木上生长的更加旺盛。  </p>
</blockquote>
<p>本篇将总结一下迁移学习与预训练语言模型PLM的知识点<br>第一、二节主要参考的是HuggingFace的Thomas Wolf的迁移学习入门介绍<br>传送门：<u><a href="https://www.youtube.com/watch?v=rEGB7-FlPRs" target="_blank" rel="noopener">https://www.youtube.com/watch?v=rEGB7-FlPRs</a></u><br>Slides：<u><a href="https://tiny.cc/NAACLTransfer" target="_blank" rel="noopener">https://tiny.cc/NAACLTransfer</a></u>  </p>
<p>第三节开始参考的是复旦大学邱锡鹏老师的最新PLM综述：<u><a href="https://arxiv.org/abs/2003.08271" target="_blank" rel="noopener">https://arxiv.org/abs/2003.08271</a></u><br>也推荐THUNLP总结的PLM PaperList：<u><a href="https://github.com/thunlp/PLMpapers" target="_blank" rel="noopener">https://github.com/thunlp/PLMpapers</a></u></p>
<h1 id="1-迁移学习是什么"><a href="#1-迁移学习是什么" class="headerlink" title="1.迁移学习是什么"></a>1.迁移学习是什么</h1><p><img src="/images/TransferLearning/1.jpg" alt="迁移学习"><br>迁移学习就是就是把已在大型数据集上训练好的模型参数迁移到新的模型中来帮助新模型训练。<br>考虑到大部分数据或任务是存在相关性的，所以通过迁移学习我们可以将已经学到的模型参数（也可理解为模型学到的知识）通过某种方式来分享给新模型从而加快并优化模型的学习效率不用像大多数网络那样从零学习，并且能够助力新模型达到更好的效果。  </p>
<p>为什么我们要在NLP中使用迁移学习：<br>（1）许多NLP任务都共享语言的常识，例如：语言表示，语法，语义等。<br>（2）带标签的数据很少，把几个任务组合在一起从而获得更多的数据。<br>（3）互联网上有大量的无标注数据，可以利用迁移学习加以利用。<br>（4）经验发现，迁移学习方法在许多有监督的NLP任务上达到了SOTA，例如：文本分类、信息抽取、QA等等。  </p>
<p><img src="/images/TransferLearning/2.jpg" alt="迁移学习"><br>我们可以看一个NER数据集的例子，基本上每种跳跃性的进展都来自某种形式的迁移学习。</p>
<h1 id="2-序列迁移学习"><a href="#2-序列迁移学习" class="headerlink" title="2.序列迁移学习"></a>2.序列迁移学习</h1><p><img src="/images/TransferLearning/3.jpg" alt="迁移学习"><br>如上图，我们现在大量的无标签语料库上做计算得到某种形式的预训练语言模型或者词向量表示，之后在不同的下游任务中微调即可。  </p>
<p>一些最近的趋势：<br>（1）在不同的训练目标上做实验：例如ALBERT中使用了句子排序任务<br>（2）加入正则化体系：LayerDrop、共享层之间的参数<br>（3）改结构：XLNet使用自回归双向建模等等</p>
<p>如何让预训练模型适应新任务：<br>（1）移除预训练任务的头部如果没用的话：例如移除softmax。<br>（2）添加目标任务的元素：在与训练模型的头尾做一定的适应性更改工作。例如：在与训练模型的顶部加一个全连接层，或者把预训练的输入喂给一个独立的模型，利用与训练模型去初始化一个目标模型等等。</p>
<p><img src="/images/TransferLearning/4.jpg" alt="迁移学习"><br>例如我们在文本分类任务下，使用Transformer去获得一段文本的表示，再用全连接层预测分类结果。  </p>
<p>再如对话系统中，我们要对模型输入：①知识背景②对话历史③已生成的句子<br><img src="/images/TransferLearning/5.jpg" alt="迁移学习"><br>我们可以将这些输入通过预训练语言模型得到其表示再融合起来，再输入到当前任务的模型当中即可。  </p>
<p>第二节的最后推荐大家另外一本书进行学习：<u><a href="https://tutorial.transferlearning.xyz/" target="_blank" rel="noopener">《迁移学习简明手册》</a></u></p>
<h1 id="3-PTM代代相传"><a href="#3-PTM代代相传" class="headerlink" title="3.PTM代代相传"></a>3.PTM代代相传</h1><p>PTM：Pre-trained Model（预训练模型）</p>
<h2 id="3-1第一代PTM"><a href="#3-1第一代PTM" class="headerlink" title="3.1第一代PTM"></a>3.1第一代PTM</h2><p>第一代PTM是为了学习一个好的词向量，下游任务不再需要这些模型，它们通常计算效率很低。比如：Word2vec（Skip-gram、CBOW）和Glove。这些模型得到的词向量是上下文无关的，并且是低层次的语义，不能捕获一词多义、句法结构、回指等高层语义。<br>在同一时代，一些研究者尝试将段落、句子或者文档编码成向量，例如：<u><a href="https://arxiv.org/abs/1405.4053" target="_blank" rel="noopener">paragraph vector</a></u>、<u><a href="https://arxiv.org/abs/1506.06726" target="_blank" rel="noopener">Skip-thought vectors</a></u>和<u><a href="https://www.aclweb.org/anthology/K16-1006.pdf" target="_blank" rel="noopener">Context2Vec</a></u>。和现在众多前沿的方法不同，他们这些句级embedding模型尝试将一个句子转变成一个固定长度的向量而不是为每个token习得一个包含上下文信息的表示。  </p>
<p>这些上下文无关的表示，通常有两个问题：<br>（1）忽略上下文<br>（2）OOV：利用<u><a href="https://arxiv.org/abs/1508.06615" target="_blank" rel="noopener">CharCNN</a></u>、<u><a href="https://arxiv.org/abs/1607.04606" target="_blank" rel="noopener">Fasttext</a></u>、<u><a href="https://arxiv.org/abs/1508.07909" target="_blank" rel="noopener">BPE</a></u>解决</p>
<h2 id="3-2第二代PTM"><a href="#3-2第二代PTM" class="headerlink" title="3.2第二代PTM"></a>3.2第二代PTM</h2><p>第二代PTM剑指学习包含上下文的向量，例如<u><a href="http://arxiv.org/abs/1708.0107" target="_blank" rel="noopener">CoVe</a></u>、<u><a href="https://arxiv.org/abs/1802.05365" target="_blank" rel="noopener">ELMo</a></u>、OpenAI GPT与<u><a href="https://arxiv.org/abs/1810.04805" target="_blank" rel="noopener">BERT</a></u>。这些经过大量预训练的编码器仍然在下游任务中使用。这些模型，还提出了不同的预训练任务，以学习用于不同目的的PTM。<br><u><a href="http://arxiv.org/abs/1708.0107" target="_blank" rel="noopener">CoVe</a></u>及同时代PTM经常被当成一个特征提取器使用来产生上下文相关的词表示，获取到词表示之后将喂给下游任务，PTM参数固定，其余针对特定任务的模型部分的参数由训练得到。<br><u><a href="http://arxiv.org/abs/1801.06146" target="_blank" rel="noopener">ULMFiT</a></u>尝试在文本分类任务上微调预训练语言模型并在六个大型文本分类数据集上达到了SOTA。其分为三个阶段：在通用数据集上训练PTM、在目标数据集上微调PTM、在目标任务上微调PTM。从这时开始，微调成为PTM应用与下游任务的常用手法。  </p>
<h1 id="4-PTM分类"><a href="#4-PTM分类" class="headerlink" title="4.PTM分类"></a>4.PTM分类</h1><h2 id="4-1-预训练任务"><a href="#4-1-预训练任务" class="headerlink" title="4.1 预训练任务"></a>4.1 预训练任务</h2><p>预训练任务是学习语言表示的关键。可将其分为三类：<br>（1）监督学习：比如CV领域中大量的PTM都是在ImageNet上预训练得到的。<br>（2）无监督学习：NLP除了NMT领域之外没有CV那么大的训练集，所以还是想办法利用无监督。<br>（3）自监督学习：有监督和无监督的混合，学习范式和有监督相同，但训练数据的标签是自动产生的。例如MLM（masked language model）  </p>
<p>我们再来看看NLP常用的预训练任务：<br>（1）LM（Laguage Modeling）<br>语言建模，是NLP最常用的无监督任务。<br>（2）MLM（Masked Language Modeling）<br>BERT就用的这个<br>（3）Seq2seq MLM<br>对MLM使用encoder-decoder结构，给encoder喂入masked序列，decoder输出masked token。该方法在MASS和T5中使用。如果下游任务是seq2seq风格的（例如QA、文摘或NMT），使用这个预训练任务会比较有利。<br>（4）E-MLM（Enhanced Masked Language Modeling）<br>最近很多研究剑指提出更吊的MLM来提升BERT的表现。比如RoBERTa是动态masking，而BERT是静态masking；UniLM将掩盖预测任务扩展成三种语言建模任务：单向的、双向的、序列到序列的预测；XLM在双语句对上使用MLM，该方法被称为TLM（Translation Language Modeling）；SpanBERT和StructBERT也分别对此做了改进。<br>（5）PLM（Permuted Language Modeling）<br>利用masked思想训练时，下游任务中并没有[MASK] token，所以在预训练和微调之间就有这么一条不可逾越的沟。为了解决这个问题提出来了PLM。PLM任务随机置换了输入序列的token，置换是从所有可能的置换中随机抽取的。然后选择置换序列中的部分token作为目标，并根据剩余标记和目标的位置训练模型来预测这些目标。<br>（6）DAE（Denoising Autoencoder）<br>DAE在原始序列中添加了一些噪声，然后再让模型恢复原序列。添加噪声的方法有一下几种：①Mask几个单词、②删掉几个token、③将一个span mask掉（span长度服从泊松分布）、④打乱句子顺序、⑤随机均匀选择一个token然后旋转文档以该token为开头，然后模型需要鉴别文档真实的开头位置。<br>（7）CTL（Contrastive Learning）<br>假设一些句对的语义比随机采样获得的句子更加相似。然后学习一个得分函数s使得最小化：<br><img src="/images/TransferLearning/6.jpg" alt="CTL"><br>其中(x,y+)代表正采样，而（x,y-）代表负采样。<br>CTL的基本思想就是让模型学会去比较两句话，对比与LM，CTL计算复杂度低，所以是一个预训练模型的好方法。BERT中的NSP就是CTL的一种。<br>[TODO]<br>（8）除此之外还有一些融合知识、跨语言、多模的预训练任务。  </p>
<h2 id="4-2-PTM分类"><a href="#4-2-PTM分类" class="headerlink" title="4.2 PTM分类"></a>4.2 PTM分类</h2><p>一共有四种分类方式：<br>（1）按照模型是否能够获得上下文有关的词表示分类：<br><img src="/images/TransferLearning/7.jpg" alt="分类1"><br>（2）按照模型的组成结构分类：<br><img src="/images/TransferLearning/8.jpg" alt="分类2"><br>（3）按照预训练任务的类型：<br><img src="/images/TransferLearning/9.jpg" alt="分类3"><br>（4）在BERT原基础上的一些扩充：<br><img src="/images/TransferLearning/10.jpg" alt="分类4">   </p>
<p>顺便附上论文中的对比表：<br><img src="/images/TransferLearning/11.jpg" alt="对比表">   </p>
<h1 id="5-PTM资源"><a href="#5-PTM资源" class="headerlink" title="5.PTM资源"></a>5.PTM资源</h1><p><img src="/images/TransferLearning/12.jpg" alt="资源">   </p>
<h1 id="6-PTM未来发展方向展望"><a href="#6-PTM未来发展方向展望" class="headerlink" title="6.PTM未来发展方向展望"></a>6.PTM未来发展方向展望</h1><p>本节搬运另外一篇文章当中的叙述：<u><a href="https://zhuanlan.zhihu.com/p/114785639" target="_blank" rel="noopener">《复旦邱锡鹏超全NLP预训练模型综述论文：两张图带你梳理完整脉络》</a></u><br>虽然 PTM 已经在很多 NLP 任务中显示出了他们强大的能力，然而由于语言的复杂性，仍存在诸多挑战。这里，研究者给出了五个未来 PTM 发展方向的建议。  </p>
<h2 id="6-1-PTM的上限"><a href="#6-1-PTM的上限" class="headerlink" title="6.1 PTM的上限"></a>6.1 PTM的上限</h2><p>目前，PTM 并没有触及其上限。大多数的 PTM 可通过使用更多训练步长以及更大数据集，来提升其性能。目前 NLP 中的 SOTA 也可通过加深模型层数来更进一步提升。PTM 的最终目的一直是我们对学习语言中通用知识内部机理的追寻。然而，这使得 PTM 需要更深层的结构，更大的数据集以及具有挑战的预训练任务，这将导致更加高昂的训练成本。因此，一个更加切实的方向是在现有的软硬件基础上，设计出更高效的模型结构、自监督预训练任务、优化器和训练技巧等。例如 ELECTRA 就是此方向上很好的一个解决方案。  </p>
<h2 id="6-2-面向任务的预训练和模型压缩"><a href="#6-2-面向任务的预训练和模型压缩" class="headerlink" title="6.2 面向任务的预训练和模型压缩"></a>6.2 面向任务的预训练和模型压缩</h2><p>在实践中，不同的目标任务需要 PTM 拥有不同功能。而 PTM 与下游目标任务间的差异通常在于两方面：模型架构与数据分发。尽管较大的 PTM 通常情况下会带来更好的性能表现，但实际问题是如何在一定情况下使用这类较大的 PTM 模型，比如低容量的设备以及低延迟的应用程序。而通常的解决方法是为目标任务设计特定的模型体系架构以及与训练任务，或者直接从现有的 PTM 中提取部分信息用以目标任务。  </p>
<p>此外，我们还可以使用模型压缩等技术去解决现有问题，尽管在 CV 方面对 CNN 的模型压缩技术进行了广泛的研究，但对于 NLP 的 PTM 来说，压缩研究只是个开始。Transformer 的全连接架构也使得模型压缩非常具有挑战性。  </p>
<h2 id="6-3-PTM的结构"><a href="#6-3-PTM的结构" class="headerlink" title="6.3 PTM的结构"></a>6.3 PTM的结构</h2><p>对于预训练，Transformer 已经被证实是一个高效的架构。然而 Transformer 最大的局限在于其计算复杂度（输入序列长度的平方倍）。受限于 GPU 显存大小，目前大多数 PTM 无法处理超过 512 个 token 的序列长度。打破这一限制需要改进 Transformer 的结构设计，例如 Transformer-XL。因此，寻找更高效的 PTM 架构设计对于捕捉长距上下文信息十分重要。设计深层神经网络结构很有挑战，或许使用如神经结构搜索 (NAS) 这类自动结构搜索方法不失为一种好的选择。  </p>
<h2 id="6-4-在参数微调之上的知识迁移"><a href="#6-4-在参数微调之上的知识迁移" class="headerlink" title="6.4 在参数微调之上的知识迁移"></a>6.4 在参数微调之上的知识迁移</h2><p>微调是目前将 PTM 的知识转移至下游任务的主要方法，但效率却很低，每个下游任务都有特定的微调参数。而改进的解决方案是修复 PTM 的原始参数，并特定为任务添加小型的微调适配模块，因此可以使用共享的 PTM 服务于多个下游任务。从 PTM 挖掘知识可以变得更加灵活，如特征提取、知识提取和数据扩充等方面。  </p>
<h2 id="6-5-PTMs-的解释性与可靠性"><a href="#6-5-PTMs-的解释性与可靠性" class="headerlink" title="6.5 PTMs 的解释性与可靠性"></a>6.5 PTMs 的解释性与可靠性</h2><p>虽然 PTM 取得了令人印象深刻的表现，然而其深层非线性结构使得决策过程非常不透明。最近，可解释的人工智能 (XAI) 成为通用 AI 社区的热点话题。不同于 CNN 使用图像，由于 Transformer 类结构和语言的复杂性，解释 PTM 变得更加困难。另外，当 PTMs 在生产系统中大规模应用时，其可靠性逐渐引起了广泛关注。深层神经网络模型在对抗性样本中显得十分脆弱，在原输入中加入难以察觉的扰动即可误导模型产生攻击者预先设定好的错误预测。  </p>
<p>除此之外，PTM 的敌对攻击防御手段是一个很有前途的方向，其能够提高 PTMs 的鲁棒性，同时使得他们对敌对攻击免疫。总之，PTMs 的可解释性与可靠性仍然需要从各个方面去探索，它能够帮助我们理解 PTM 的工作机制，为更好的使用及性能改进提供指引。</p>

            </div>

            <!-- Post Comments -->
            

        </div>
        <!-- Copyright 版权 start -->
                <div id="copyright">
            <ul>
                <li>&copy;2020 北望你的安. 版权所有</li>
            </ul>
            
                <span id="busuanzi_container_site_pv">本站总访问量<span id="busuanzi_value_site_pv"></span>次，</span>
				<span id="busuanzi_container_site_uv"> 访客数 <span id="busuanzi_value_site_uv"></span> 人. </span>
			
			<br>
			<span>友情链接：<a href='http://www.demilab.cn' target='_blank'>DEMI实验室</a>&nbsp;&nbsp;&nbsp;<a href='http://zd11024.cn/' target='_blank'>ZD</a></span>
        </div>
    </div>
</body>



 	
</html>
